Term 2023 Fall
Team members:
Abstract
From 1959 to 2017, music has changed immensely, whether it be jazz to
rock to pop to edm. Time’s have changed and the billboards have too.
This project will explore:
- A songs grade to find the best song in the dataset
- What types of songs are there? what modes or key modes do they
use?
- How loud are these songs and what does it have to do with other
factors?
- Comparisons between variables to other variables to find any
correlations?
- Which artist had the most songs in the top hits?
- As well as trend patterns from years to years
With these explorations, we should be able to get a good narrative on
the shifts in music over the past six decades.
We will be using the data available at:
all_billboard_summer_hits.csv
Introduction
The musical landscape has undergone transformations over the decades,
with Billboard hits acting as a time capsule reflecting the evolving
tastes and trends of society. In this exploration, we delve into the
rich history of Billboard chart-toppers spanning from 1958 to 2017. By
looking at key musical characteristics such as danceability, energy, and
acousticness, we aim to uncover nuanced patterns, trends, and the
ever-shifting dynamics of popular music. Through visualizations and
analyses, we plan to provide a comprehensive overview of how these
musical elements have shaped and been shaped by cultural shifts,
technological advancements, and the ever-changing musical landscape over
the past six decades.
Prerequisites
Loading the packages needed
library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)
Dataset
Importing the data set from Github, which can be found here.
url <- "https://raw.githubusercontent.com/SilShizukesa/final_project_ds/master/data/all_billboard_summer_hits.csv"
all_billboard_summer_hits <- read_csv(url)
Rows: 600 Columns: 22── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): key, mode, track_uri, key_mode, playlist_name, playlist_img, track_name, artist_name, album_name, album_img
dbl (12): danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence, tempo, duration_ms, time_signature, year
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
For our report, let us take a quick peak at our dataset:
all_billboard_summer_hits
Data Exploration
If we want to explore our dataset, we’ll need to get a good feel for
the entries in it as well as some key details for each observation.
Let’s summarise the dataset and see what the variables are:
summary(all_billboard_summer_hits)
danceability energy key loudness mode speechiness acousticness instrumentalness liveness valence tempo track_uri
Min. :0.2170 Min. :0.0600 Length:600 Min. :-23.574 Length:600 Min. :0.02330 Min. :0.0000488 Min. :0.0000000 Min. :0.02480 Min. :0.0695 Min. : 62.83 Length:600
1st Qu.:0.5457 1st Qu.:0.4768 Class :character 1st Qu.:-10.947 Class :character 1st Qu.:0.03280 1st Qu.:0.0417250 1st Qu.:0.0000000 1st Qu.:0.08595 1st Qu.:0.4790 1st Qu.:100.22 Class :character
Median :0.6480 Median :0.6405 Mode :character Median : -8.072 Mode :character Median :0.04140 Median :0.1620000 Median :0.0000032 Median :0.12400 Median :0.6900 Median :120.01 Mode :character
Mean :0.6407 Mean :0.6221 Mean : -8.587 Mean :0.06866 Mean :0.2665156 Mean :0.0364316 Mean :0.17979 Mean :0.6488 Mean :120.48
3rd Qu.:0.7402 3rd Qu.:0.7830 3rd Qu.: -5.862 3rd Qu.:0.06990 3rd Qu.:0.4472500 3rd Qu.:0.0007132 3rd Qu.:0.22275 3rd Qu.:0.8482 3rd Qu.:133.84
Max. :0.9800 Max. :0.9890 Max. : -1.097 Max. :0.51700 Max. :0.9870000 Max. :0.9540000 Max. :0.98900 Max. :0.9860 Max. :210.75
duration_ms time_signature key_mode playlist_name playlist_img track_name artist_name album_name album_img year
Min. :103386 Min. :3.000 Length:600 Length:600 Length:600 Length:600 Length:600 Length:600 Length:600 Min. :1958
1st Qu.:192887 1st Qu.:4.000 Class :character Class :character Class :character Class :character Class :character Class :character Class :character 1st Qu.:1973
Median :226926 Median :4.000 Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character Median :1988
Mean :229434 Mean :3.972 Mean :1988
3rd Qu.:257854 3rd Qu.:4.000 3rd Qu.:2002
Max. :557293 Max. :5.000 Max. :2017
Here are a few samples to show what a data entry looks like:
sample_n(all_billboard_summer_hits, 5)
What is the best Summer Billboard Hit?
This question can seem to be a loaded question, and truthfully very
opionated. But we can take some key factors into consideration to decide
factually what is the best song?
*Taking the key factors into consideration, giving a weight to each
factor then gives us the chance to multiply it by its respective data
point and figure out its overall score once added
*Once the score has been calculated, all that must be done is put
everything into the original table and select the data points we only
want to see
*Finally, once the scores are calculated and given, we then will give
each score a “Grade” based on this scale: #1 song = The Overall Best
Song 70+ = “S Tier” 60-69 = “A Tier” 50-59 = “B Tier” 40-49 = “C Tier”
39 and below = “D Tier”
songs_data <- all_billboard_summer_hits
weights <- c(danceability = .3,
liveness = .02,
energy = .3,
valence = .3,
acousticness = .02,
speechiness = .04,
instrumentalness = .02)
all_billboard_summer_hits %>%
mutate(score = rowSums(songs_data[, names(weights)] * weights)) %>%
select(track_name, artist_name, score, year, danceability, liveness, energy, valence, acousticness, speechiness, instrumentalness) %>%
arrange(desc(score))
NA
NA
This is our function!
grade <- function(score) {
if (score >= .7287) {
return("The Overall Best Song")
} else if (score >= .70 & score <= .72701942) {
return("S Tier")
} else if (score >= .60 & score <= .70) {
return("A Tier")
} else if (score >= .50 & score <= .60) {
return("B Tier")
} else if (score >= .40 & score <= .50) {
return("C Tier")
} else if (score < .07) {
return("Worst Song in the Summer Billboard Hits")
} else {
return("D Tier")
}
}
Lets use our brand new function to find the grades for each songs
score:
# Function to calculate grade
grade <- function(score) {
if (score >= .7287) {
return("The Overall Best Song")
} else if (score >= .70 & score <= .72701942) {
return("S Tier")
} else if (score >= .60 & score <= .70) {
return("A Tier")
} else if (score >= .50 & score <= .60) {
return("B Tier")
} else if (score >= .40 & score <= .50) {
return("C Tier")
} else if (score < .07) {
return("Worst Song in the Summer Billboard Hits")
} else {
return("D Tier")
}
}
# Apply the grade function to the dataset
result_table <- all_billboard_summer_hits %>%
mutate(score = rowSums(across(names(weights)) * weights),
grade = sapply(score, grade)) %>%
select(track_name, artist_name, score, grade, year, danceability, liveness, energy, valence, acousticness, speechiness, instrumentalness) %>%
arrange(desc(score))
# View the result table
print(result_table)
NA
With this data exploration, we have now made a formula that will find
us the best overall song in the billboard summer hits dataset that is
without any opinionated input. It is all solely based on data given to
use in numerical observations of songs danceability, valence,
acousticeness, energy, and other factors.
Given this output, the best song on this list is: Electric Avennue by
Eddie Grant made in 1983 with a score of .72871144
what else can we find about this song that makes it “the best”?
all_billboard_summer_hits$duration_minutes <- all_billboard_summer_hits$duration_ms / (1000 * 60)
all_billboard_summer_hits %>%
filter(track_name == "Electric Avennue") %>%
select(duration_minutes, track_name, danceability, valence, energy, everything())
we can see that this song is 3.2 minutes long, as well as having a
very high danceability score. However, the energy seems to be a be low
the reason for it being the best overall song is the fact that its
valence is right up there with danceability in being so high. And after
seeing the scores for its other variables, it can be confirmed as to why
Electric Avennue is the overall best song.
Data comparisons
In this section we want to look at these hits as a whole. Are there
any trends we can spot?
Nominal Data
The first data type we looked at was if a song was in major or
minor.
ggplot(data = all_billboard_summer_hits, aes(x = mode, fill = mode)) +
geom_bar(stat = "count", show.legend = FALSE, color = "black", alpha = 0.8) +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
labs(title = "Distribution of Mode",
x = element_blank(),
y = element_blank()) +
scale_fill_manual(values = c("#56B4E9", "#E69F00")) +
theme_minimal() +
theme(axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust = 0.5))

Now that we can see that the majority of songs are in the major mode.
We didn’t feel like it was enough and wanted to know the amount of each
different key modes of all the songs over the years.
Therefore, we will find the specific counts of each key mode in this
graph:
library(dplyr)
all_billboard_summer_hits %>%
count(key_mode, mode) %>%
ggplot(aes(x = reorder(key_mode, n), y = n, fill = mode)) +
geom_bar(stat = "identity") +
geom_text(aes(label = n), vjust = 0.5, hjust = 1) +
labs(title = "Distribution of Key Mode",
x = "Key Mode",
y = element_blank()) +
scale_fill_manual(values = c("#66c2a5", "#fc8d62"), name = "Mode") +
theme_minimal() +
coord_flip() +
theme(axis.text.x = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust = 0.5))

And after a quick look, we can see that most songs have used C major
in the billboard summer hits. Maybe this means C major is the best key
mode for making the top billboard summer hits?
The table below is just to show some songs that are in the C major
key mode:
all_billboard_summer_hits %>%
filter(key_mode == "C major") %>%
select(key_mode, track_name, everything())
Loudness
Let’s take a look at the Loudness scale:
dis_loud <- ggplot(data = all_billboard_summer_hits, aes(x = loudness)) +
geom_histogram(binwidth = .5, fill = "#3498db", color ="#2c3e50", alpha = .5) +
labs(title = "Distribution of Loudness",
x = "Loudness",
y = "Frequency") +
theme_minimal()
ggplotly(dis_loud)
Here we can see that the majority of songs lay between -10 Db and -5
Db, as well as the data having a left skew. We wanted to make a very
simple and easy graph to look at for the loudness scale, making it
interactive with plotly allows for users to hover over the bars to see
the individual counts for each loudness scale integer. With the highest
being 42 songs at a decibel level of -6.
Now let us take a look at loudness compared with other
variables:
First up is loudness compared to liveness
loud_v_live <- ggplot(data = all_billboard_summer_hits, aes(x = liveness, y = loudness)) +
geom_point(alpha = 0.7, size = 3, color = "#3498db") +
geom_smooth(method = "lm", color = "#2c3e50", linetype = "dashed") +
labs(title = "Loudness vs Liveness",
x = "Liveness",
y = "Loudness") +
theme_minimal()
ggplotly(loud_v_live)
`geom_smooth()` using formula = 'y ~ x'
This graph shows that there is no relationship between liveliness and
loudness. Though, it is important to note that most songs only have a
slight live element to them. This is probably the outcome of songs being
recorded in recording studios as opposed to live performances.
all_billboard_summer_hits %>%
select(liveness, loudness, track_name)
ggplot(data = all_billboard_summer_hits, aes(x = energy, y = loudness)) +
geom_point(alpha = 0.7, size = 3, color = "#3498db") +
geom_smooth(method = "lm",color = "#2c3e50", linetype = "dashed") +
labs(title = "Loudness vs Energy",
x = "Energy",
y = "Loudness") +
theme_minimal() +
theme(legend.position = "top")

Energy and loudness have a favorable correlation with one another.
This finding supports our earlier theories that suggested that energy
levels would increase with music volume.
all_billboard_summer_hits %>%
select(energy, loudness, track_name)
Danceability
Next let’s take a look at the danceability scale:
ggplot(data = all_billboard_summer_hits, aes(x = danceability)) +
geom_histogram(binwidth = .05, fill = "#8e44ad", color = "#008080", alpha = .5) +
labs(title = "Distribution of Danceability",
x = "Danceability",
y = "Frequency") +
theme_minimal()

The song distribution is skewed slightly to the left and follows a
standard bell shape. This demonstrates that most of these singles are at
least somewhat danceable.
Next let us take a look at danceability compared with other
variables:
First we will take a look at Energy compared to Danceability:
ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = energy)) +
geom_point(alpha = 0.5, size = 3, color = "#8e44ad") + # Adjusted point aesthetics
geom_smooth(method = "lm", color = "#008080", linetype = "dashed") +
labs(title = "Danceability vs Energy",
x = "Danceability",
y = "Energy") +
theme_minimal()

There is a small correlation between energy and danceability. Though
we can see the best range for a song’s danceability is from .5 to
.75.
all_billboard_summer_hits %>%
select(energy, danceability, track_name)
Will we see the same thing with tempo?
ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = tempo)) +
geom_point(alpha = 0.5, size = 3, color = "#8e44ad") +
geom_smooth(method = "lm", color = "#008080", linetype = "dashed") +
labs(title = "Danceability vs Tempo",
x = "Danceability",
y = "Tempo") +
theme_minimal()

A song’s danceability can be viewed as a function of its tempo; this
graph indicates that a tempo of between 150 and 100 is ideal.
all_billboard_summer_hits %>%
select(tempo, danceability, track_name)
Valence
To what extent are songs happy? Let us examine the following pair of
graphs:
ggplot(data = all_billboard_summer_hits, aes(x = "", y = valence)) +
geom_boxplot(fill = "#2ecc71", color = "#e67e22", alpha = 0.2) +
labs(title = "Boxplot of Valence",
y = "Valence") +
coord_flip() +
theme_minimal() +
theme(
axis.title.y = element_blank())

ggplot(data = all_billboard_summer_hits, aes(x = valence)) +
geom_histogram(binwidth = .05, fill = "#2ecc71", color = "#e67e22", alpha = .2) +
labs(title = "Distribution of Valence",
x = "Valence",
y = "Frequency") +
theme_minimal()

According to these graphs, happiness has a significant leftward skew,
which indicates that the majority of songs that become hits will sound
happy.
Let’s now examine an energy and valence scatter plot:
ggplot(data = all_billboard_summer_hits, aes(x = valence, y = energy )) +
geom_point(alpha = 0.2, size = 3, color = "#2ecc71") +
geom_smooth(method = "lm", color = "#e67e22", linetype = "dashed") +
labs(title = "Valence vs Energy",
x = "Valence",
y = "Energy") +
theme_minimal()

In any event, I don’t think this is all that surprising. It appeared
evident that happiness and energy were positively correlated.
all_billboard_summer_hits %>%
select(energy, valence, track_name)
Artist insight
We want to examine the artist with the greatest hits in this section
and compare them to their contemporaries. Does said artist adhere to the
established trends? Or are they going to overlook them?
Exploration
What artist has the most summer hits?
all_billboard_summer_hits %>%
group_by(artist_name) %>%
summarise(count = n()) %>%
arrange(desc(count)) %>%
slice_head(n = 1)
NA
With seven entries on the list, Rihanna defeated every other artist
to take the top spot. Which songs were these?
rihanna_songs <- all_billboard_summer_hits %>%
filter(artist_name == "Rihanna")
rihanna_songs %>%
select(track_name, year)
The list of songs is visible above. We have listed the songs below
along with every characteristic that has been linked to them.
rihanna_songs
Rihanna Nominal Graphs
As in the prior sections, let’s start by examining Rihanna’s nominal
statistics:
ggplot(data = rihanna_songs) +
geom_bar(aes(x = mode, fill = mode), color = "black", alpha = 0.8, stat = "count") +
labs(title = "Distribution of Modes in Rihanna's Songs") +
scale_fill_manual(values = c("#3498db", "#e74c3c")) +
theme_minimal() +
theme(
legend.position = "none",
axis.title.y = element_blank(),
axis.title.x = element_blank())

With a higher average of songs in a minor mode, Rihanna beats the
mean with a ratio of 4:3.
Rihanna Comparisons
Let us take a quick look at Rihanna’s placements in some of our
previous graphs. How will she compare?
ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = tempo)) +
geom_point(alpha = 0.7, size = 3, color = "#3498db") +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
#add rihannas songs
geom_point(data = rihanna_songs, aes(x = danceability, y = tempo), alpha = 1, size = 3, color = "#2ecc71") +
labs(title = "Danceability vs Tempo",
x = "Danceability",
y = "Tempo") +
theme_minimal()

ggplot(data = all_billboard_summer_hits, aes(x = liveness, y = loudness)) +
geom_point(alpha = 0.7, size = 3, color = "#3498db") +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
# Add Rihanna's songs
geom_point(data = rihanna_songs, aes(x = liveness, y = loudness), alpha = 1, size = 3, color = "#2ecc71") +
labs(title = "loudness vs Liveness",
x = "Liveness",
y = "Loudness") +
theme_minimal() +
theme(legend.position = "top")

ggplot(data = all_billboard_summer_hits, aes(x = valence, y = energy)) +
geom_point(alpha = 0.7, size = 3, color = "#3498db") +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
# Add Rihanna's songs
geom_point(data = rihanna_songs, aes(x = valence, y = energy), alpha = 1, size = 3, color = "#2ecc71") +
labs(title = "Valence vs Energy",
x = "Valence",
y = "Energy") +
theme_minimal() +
theme(legend.position = "top")

Rihanna’s music has above-average danceability and a dynamic touch
thanks to its varying tempo. Her studio-centric style, which is
positioned on the far left for liveliness, is in line with that of other
artists. Her songs are notable for their constant emphasis on volume,
which has a striking and captivating effect. Rihanna’s music explores a
range of energy levels while keeping a central valence, making for a
varied and captivating listening experience.
As we have shown Rihanna makes unique music compared to music as a
whole. But, lets see if she gets closer to the mean when we look at her
songs per year:
specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted
filtered_data <- all_billboard_summer_hits %>%
filter(year %in% specific_years)
ggplot(data = filtered_data, aes(x = danceability, y = tempo)) +
geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
labs(title = "Danceability and Tempo",
x = "Danceability",
y = "Tempo") +
scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
theme_minimal() +
theme(legend.position = "top") +
# Facet by year
facet_wrap(~ year, scales = "free")

specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted
filtered_data <- all_billboard_summer_hits %>%
filter(year %in% specific_years)
ggplot(data = filtered_data, aes(x = liveness, y = loudness)) +
geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
labs(title = "Loudness vs Liveness",
x = "Liveness",
y = "Loudness") +
scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
theme_minimal() +
theme(legend.position = "top") +
# Facet by year
facet_wrap(~ year, scales = "free")

specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted
filtered_data <- all_billboard_summer_hits %>%
filter(year %in% specific_years)
ggplot(data = filtered_data, aes(x = valence, y = energy)) +
geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
labs(title = "Valence vs Energy",
x = "Valence",
y = "Energy") +
scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
theme_minimal() +
theme(legend.position = "top") +
# Facet by year
facet_wrap(~ year, scales = "free")

These graphs demonstrate that Rihanna is, in fact, exceptional. Her
songs are typically found on the edge of the uncertainty cone, but there
is room for uncertainty with only 10 samples. Her music did seem to
deviate the most from the mean in 2007, and was the closest in 2008
& 2012.
Summary
Rihanna’s incredible musical ability, which combines dynamic tempo
changes and above-average danceability, fits in with other artists in a
studio-centric liveliness. Her songs stand out for emphasizing loudness,
which produces an arresting and alluring effect. Although there is some
uncertainty due to the small 10-sample size, the graphs show that her
music regularly falls on the edge of the uncertainty cone. While her
music came very close to the mean in 2008 and 2012, there were some
notable departures from the mean in 2007. This combination highlights
Rihanna’s interesting and varied career in music, both stylistically and
numerically.
For Future Consideration
Does length of song correlate to danceability scores?
df <- all_billboard_summer_hits %>%
select(danceability, duration_ms, track_name, artist_name) %>%
arrange(desc(duration_ms))
df$duration_minutes <- df$duration_ms / (1000 * 60)
df %>%
select(danceability, duration_minutes, track_name, artist_name)
NA
NA
NA
In the end, we very briefly looked into what some correlations could
be between the length of songs and their danceability score. As we can
see above in the table, the longest song (in minutes) is “I want your
sex Pts 1 and 2 remastered” by George Michaels with a danceability score
of .812. But right below it is an 8.95 minute long song with a score of
.217. Which to us, makes a lot of sense, if a song is very long then you
wouldn’t want to dance for too long but then it seems like there could
be outliers to this. We wanted to leave this for the end for future
consideration to take it further when we are more proficient than we are
with R to find out more about this detail.
Conclusion
In conclusion, our investigation has explored the dynamic environment
of Billboard successes between 1959 and 2017, revealing notable changes
in musical styles and traits. We created a formula to objectively
identify the greatest song overall in the Billboard summer hits dataset
by using a thorough analysis. This formula took into account important
parameters like danceability, liveness, energy, and more. We developed a
grading system that assigns songs to tiers based on our meticulous study
and balancing of these elements, offering an objective evaluation of
their general quality. Analyzing nominal data exposed interesting
trends, like the dominance of C major key mode and the frequency of
songs in the major mode. We also looked into valence, loudness, and
danceability, finding patterns and insights into the connections between
these musical components. Additional artist-specific research, with a
special focus on Rihanna, highlighted her unique musical qualities and
the diversity and originality seen in the larger dataset. All things
considered, our study provides a thorough examination of the musical
landscape over the course of six decades, providing insightful
information about the elements that lead to the popularity of Billboard
summer successes.
Glossary
Danceability: A measure of how suitable a track is for dancing based
on factors like tempo, rhythm stability, beat strength, and overall
regularity.
Energy: Represents the intensity and activity level of a song. High
energy songs might be more lively and dynamic, while low energy songs
may be more calm and subdued.
Key: Indicates the key signature of the song, representing the tonal
center or home base of the music.
Loudness: Refers to the volume of the song. It’s usually measured in
decibels (dB). Higher values indicate louder songs.
Mode: Describes the modality of the music, i.e., whether it’s in a
major or minor key. Major keys often sound more uplifting, while minor
keys can give a more melancholic feel.
Speechiness: Measures the presence of spoken words in a track. Songs
with higher speechiness values may contain more spoken words than
singing.
Acousticness: Indicates the likelihood that a track is acoustic,
meaning it doesn’t heavily rely on electronic or synthesized
elements.
Instrumentalness: Measures the likelihood that a track is
instrumental, without vocal content.
Liveness: Indicates the presence of an audience in the recording. A
higher value suggests the track was likely recorded live.
Valence: Describes the musical positiveness of a track. Higher
valence values suggest a more positive, happy, or cheerful mood.
Tempo: Represents the speed or pace of a song, typically measured in
beats per minute (BPM).
Duration_ms: The duration of the song in milliseconds.
Time Signature: Describes the number of beats in a bar and which note
value gets the beat.
Key Mode: A combination of key and mode, indicating both the tonal
center and the modality of the music.
LS0tCnRpdGxlOiAiRXhwbG9yaW5nIE11c2ljIFRocm91Z2ggVGhlIFllYXJzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoqKlRlcm0gMjAyMyBGYWxsKioKClRlYW0gbWVtYmVyczoKCi0gICBTdHVkZW50IDE6IFtOb2FoIFZhbnNjb3lvY10obm9haC52YW5zY295b2NAZ21haWwuY29tKQotICAgU3R1ZGVudCAyOiBbQnJhbmRvbiBDb25uZWxsXShiY29ubmVsbDc3MzBAZmxvcmlkYXBvbHkuZWR1KQoKKipBYnN0cmFjdCoqCgpGcm9tIDE5NTkgdG8gMjAxNywgbXVzaWMgaGFzIGNoYW5nZWQgaW1tZW5zZWx5LCB3aGV0aGVyIGl0IGJlIGphenogdG8gcm9jayB0byBwb3AgdG8gZWRtLiBUaW1lJ3MgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgYmlsbGJvYXJkcyBoYXZlIHRvby4gVGhpcyBwcm9qZWN0IHdpbGwgZXhwbG9yZToKCiAgKiBBIHNvbmdzIGdyYWRlIHRvIGZpbmQgdGhlIGJlc3Qgc29uZyBpbiB0aGUgZGF0YXNldAogICogV2hhdCB0eXBlcyBvZiBzb25ncyBhcmUgdGhlcmU/IHdoYXQgbW9kZXMgb3Iga2V5IG1vZGVzIGRvIHRoZXkgdXNlPwogICogSG93IGxvdWQgYXJlIHRoZXNlIHNvbmdzIGFuZCB3aGF0IGRvZXMgaXQgaGF2ZSB0byBkbyB3aXRoIG90aGVyIGZhY3RvcnM/CiAgKiBDb21wYXJpc29ucyBiZXR3ZWVuIHZhcmlhYmxlcyB0byBvdGhlciB2YXJpYWJsZXMgdG8gZmluZCBhbnkgY29ycmVsYXRpb25zPwogICogV2hpY2ggYXJ0aXN0IGhhZCB0aGUgbW9zdCBzb25ncyBpbiB0aGUgdG9wIGhpdHM/CiAgKiBBcyB3ZWxsIGFzIHRyZW5kIHBhdHRlcm5zIGZyb20geWVhcnMgdG8geWVhcnMKCldpdGggdGhlc2UgZXhwbG9yYXRpb25zLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYSBnb29kIG5hcnJhdGl2ZSBvbiB0aGUgc2hpZnRzIGluIG11c2ljIG92ZXIgdGhlIHBhc3Qgc2l4IGRlY2FkZXMuCgpXZSB3aWxsIGJlIHVzaW5nIHRoZSBkYXRhIGF2YWlsYWJsZSBhdDogYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cy5jc3YKCiMgSW50cm9kdWN0aW9uCgpUaGUgbXVzaWNhbCBsYW5kc2NhcGUgaGFzIHVuZGVyZ29uZSB0cmFuc2Zvcm1hdGlvbnMgb3ZlciB0aGUgZGVjYWRlcywgd2l0aCBCaWxsYm9hcmQgaGl0cyBhY3RpbmcgYXMgYSB0aW1lIGNhcHN1bGUgcmVmbGVjdGluZyB0aGUgZXZvbHZpbmcgdGFzdGVzIGFuZCB0cmVuZHMgb2Ygc29jaWV0eS4gSW4gdGhpcyBleHBsb3JhdGlvbiwgd2UgZGVsdmUgaW50byB0aGUgcmljaCBoaXN0b3J5IG9mIEJpbGxib2FyZCBjaGFydC10b3BwZXJzIHNwYW5uaW5nIGZyb20gMTk1OCB0byAyMDE3LiBCeSBsb29raW5nIGF0IGtleSBtdXNpY2FsIGNoYXJhY3RlcmlzdGljcyBzdWNoIGFzIGRhbmNlYWJpbGl0eSwgZW5lcmd5LCBhbmQgYWNvdXN0aWNuZXNzLCB3ZSBhaW0gdG8gdW5jb3ZlciBudWFuY2VkIHBhdHRlcm5zLCB0cmVuZHMsIGFuZCB0aGUgZXZlci1zaGlmdGluZyBkeW5hbWljcyBvZiBwb3B1bGFyIG11c2ljLiBUaHJvdWdoIHZpc3VhbGl6YXRpb25zIGFuZCBhbmFseXNlcywgd2UgcGxhbiB0byBwcm92aWRlIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiBob3cgdGhlc2UgbXVzaWNhbCBlbGVtZW50cyBoYXZlIHNoYXBlZCBhbmQgYmVlbiBzaGFwZWQgYnkgY3VsdHVyYWwgc2hpZnRzLCB0ZWNobm9sb2dpY2FsIGFkdmFuY2VtZW50cywgYW5kIHRoZSBldmVyLWNoYW5naW5nIG11c2ljYWwgbGFuZHNjYXBlIG92ZXIgdGhlIHBhc3Qgc2l4IGRlY2FkZXMuCgojIFByZXJlcXVpc2l0ZXMKCkxvYWRpbmcgdGhlIHBhY2thZ2VzIG5lZWRlZAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGxvdGx5KQpgYGAKCiMgRGF0YXNldAoKSW1wb3J0aW5nIHRoZSBkYXRhIHNldCBmcm9tIEdpdGh1Yiwgd2hpY2ggY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vcmVpc2FuYXIvZGF0YXNldHMvYmxvYi9tYXN0ZXIvYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cy5jc3YpLgoKYGBge3J9CnVybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1NpbFNoaXp1a2VzYS9maW5hbF9wcm9qZWN0X2RzL21hc3Rlci9kYXRhL2FsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMuY3N2IgphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzIDwtIHJlYWRfY3N2KHVybCkKYGBgCkZvciBvdXIgcmVwb3J0LCBsZXQgdXMgdGFrZSBhIHF1aWNrIHBlYWsgYXQgb3VyIGRhdGFzZXQ6CgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cwpgYGAKCiMgRGF0YSBFeHBsb3JhdGlvbgoKSWYgd2Ugd2FudCB0byBleHBsb3JlIG91ciBkYXRhc2V0LCB3ZSdsbCBuZWVkIHRvIGdldCBhIGdvb2QgZmVlbCBmb3IgdGhlIGVudHJpZXMgaW4gaXQgYXMgd2VsbCBhcyBzb21lIGtleSBkZXRhaWxzIGZvciBlYWNoIG9ic2VydmF0aW9uLiBMZXQncyBzdW1tYXJpc2UgdGhlIGRhdGFzZXQgYW5kIHNlZSB3aGF0IHRoZSB2YXJpYWJsZXMgYXJlOgoKYGBge3J9CnN1bW1hcnkoYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cykKYGBgCgpIZXJlIGFyZSBhIGZldyBzYW1wbGVzIHRvIHNob3cgd2hhdCBhIGRhdGEgZW50cnkgbG9va3MgbGlrZToKCmBgYHtyfQpzYW1wbGVfbihhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCA1KQpgYGAKIyBXaGF0IGlzIHRoZSBiZXN0IFN1bW1lciBCaWxsYm9hcmQgSGl0PwoKVGhpcyBxdWVzdGlvbiBjYW4gc2VlbSB0byBiZSBhIGxvYWRlZCBxdWVzdGlvbiwgYW5kIHRydXRoZnVsbHkgdmVyeSBvcGlvbmF0ZWQuIEJ1dCB3ZSBjYW4gdGFrZSBzb21lIGtleSBmYWN0b3JzIGludG8gY29uc2lkZXJhdGlvbiB0byBkZWNpZGUgZmFjdHVhbGx5IHdoYXQgaXMgdGhlIGJlc3Qgc29uZz8KCiAgKlRha2luZyB0aGUga2V5IGZhY3RvcnMgaW50byBjb25zaWRlcmF0aW9uLCBnaXZpbmcgYSB3ZWlnaHQgdG8gZWFjaCBmYWN0b3IgdGhlbiBnaXZlcyB1cyB0aGUgY2hhbmNlIHRvIG11bHRpcGx5IGl0IGJ5IGl0cyByZXNwZWN0aXZlIGRhdGEgcG9pbnQgYW5kIGZpZ3VyZSBvdXQgaXRzIG92ZXJhbGwgc2NvcmUgb25jZSBhZGRlZAogIAogICpPbmNlIHRoZSBzY29yZSBoYXMgYmVlbiBjYWxjdWxhdGVkLCBhbGwgdGhhdCBtdXN0IGJlIGRvbmUgaXMgcHV0IGV2ZXJ5dGhpbmcgaW50byB0aGUgb3JpZ2luYWwgdGFibGUgYW5kIHNlbGVjdCB0aGUgZGF0YSBwb2ludHMgd2Ugb25seSB3YW50IHRvIHNlZQogIAogICpGaW5hbGx5LCBvbmNlIHRoZSBzY29yZXMgYXJlIGNhbGN1bGF0ZWQgYW5kIGdpdmVuLCB3ZSB0aGVuIHdpbGwgZ2l2ZSBlYWNoIHNjb3JlIGEgIkdyYWRlIiBiYXNlZCBvbiB0aGlzIHNjYWxlOgogICMxIHNvbmcgPSBUaGUgT3ZlcmFsbCBCZXN0IFNvbmcKICA3MCsgPSAiUyBUaWVyIgogIDYwLTY5ID0gIkEgVGllciIKICA1MC01OSA9ICJCIFRpZXIiCiAgNDAtNDkgPSAiQyBUaWVyIgogIDM5IGFuZCBiZWxvdyA9ICJEIFRpZXIiCiAgCgpgYGB7cn0Kc29uZ3NfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzCgp3ZWlnaHRzIDwtIGMoZGFuY2VhYmlsaXR5ID0gLjMsIAogICAgICAgICAgICAgbGl2ZW5lc3MgPSAuMDIsIAogICAgICAgICAgICAgZW5lcmd5ID0gLjMsIAogICAgICAgICAgICAgdmFsZW5jZSA9IC4zLCAKICAgICAgICAgICAgIGFjb3VzdGljbmVzcyA9IC4wMiwgCiAgICAgICAgICAgICBzcGVlY2hpbmVzcyA9IC4wNCwgCiAgICAgICAgICAgICBpbnN0cnVtZW50YWxuZXNzID0gLjAyKQoKYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBtdXRhdGUoc2NvcmUgPSByb3dTdW1zKHNvbmdzX2RhdGFbLCBuYW1lcyh3ZWlnaHRzKV0gKiB3ZWlnaHRzKSkgJT4lCiAgc2VsZWN0KHRyYWNrX25hbWUsIGFydGlzdF9uYW1lLCBzY29yZSwgeWVhciwgIGRhbmNlYWJpbGl0eSwgbGl2ZW5lc3MsIGVuZXJneSwgdmFsZW5jZSwgYWNvdXN0aWNuZXNzLCBzcGVlY2hpbmVzcywgaW5zdHJ1bWVudGFsbmVzcykgJT4lCiAgYXJyYW5nZShkZXNjKHNjb3JlKSkKCgpgYGAKVGhpcyBpcyBvdXIgZnVuY3Rpb24hCmBgYHtyfQpncmFkZSA8LSBmdW5jdGlvbihzY29yZSkgewogIGlmIChzY29yZSA+PSAuNzI4NykgewogICAgcmV0dXJuKCJUaGUgT3ZlcmFsbCBCZXN0IFNvbmciKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjcwICYgc2NvcmUgPD0gLjcyNzAxOTQyKSB7CiAgICByZXR1cm4oIlMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA+PSAuNjAgJiBzY29yZSA8PSAuNzApIHsKICAgIHJldHVybigiQSBUaWVyIikKICB9IGVsc2UgaWYgKHNjb3JlID49IC41MCAmIHNjb3JlIDw9IC42MCkgewogICAgcmV0dXJuKCJCIFRpZXIiKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjQwICYgc2NvcmUgPD0gLjUwKSB7CiAgICByZXR1cm4oIkMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA8IC4wNykgewogICAgcmV0dXJuKCJXb3JzdCBTb25nIGluIHRoZSBTdW1tZXIgQmlsbGJvYXJkIEhpdHMiKQogIH0gZWxzZSB7CiAgICByZXR1cm4oIkQgVGllciIpCiAgfQp9CgpgYGAKCkxldHMgdXNlIG91ciBicmFuZCBuZXcgZnVuY3Rpb24gdG8gZmluZCB0aGUgZ3JhZGVzIGZvciBlYWNoIHNvbmdzIHNjb3JlOgpgYGB7cn0KCgojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBncmFkZQpncmFkZSA8LSBmdW5jdGlvbihzY29yZSkgewogIGlmIChzY29yZSA+PSAuNzI4NykgewogICAgcmV0dXJuKCJUaGUgT3ZlcmFsbCBCZXN0IFNvbmciKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjcwICYgc2NvcmUgPD0gLjcyNzAxOTQyKSB7CiAgICByZXR1cm4oIlMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA+PSAuNjAgJiBzY29yZSA8PSAuNzApIHsKICAgIHJldHVybigiQSBUaWVyIikKICB9IGVsc2UgaWYgKHNjb3JlID49IC41MCAmIHNjb3JlIDw9IC42MCkgewogICAgcmV0dXJuKCJCIFRpZXIiKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjQwICYgc2NvcmUgPD0gLjUwKSB7CiAgICByZXR1cm4oIkMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA8IC4wNykgewogICAgcmV0dXJuKCJXb3JzdCBTb25nIGluIHRoZSBTdW1tZXIgQmlsbGJvYXJkIEhpdHMiKQogIH0gZWxzZSB7CiAgICByZXR1cm4oIkQgVGllciIpCiAgfQp9CgojIEFwcGx5IHRoZSBncmFkZSBmdW5jdGlvbiB0byB0aGUgZGF0YXNldApyZXN1bHRfdGFibGUgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBtdXRhdGUoc2NvcmUgPSByb3dTdW1zKGFjcm9zcyhuYW1lcyh3ZWlnaHRzKSkgKiB3ZWlnaHRzKSwKICAgICAgICAgZ3JhZGUgPSBzYXBwbHkoc2NvcmUsIGdyYWRlKSkgJT4lCiAgc2VsZWN0KHRyYWNrX25hbWUsIGFydGlzdF9uYW1lLCBzY29yZSwgZ3JhZGUsIHllYXIsICBkYW5jZWFiaWxpdHksIGxpdmVuZXNzLCBlbmVyZ3ksIHZhbGVuY2UsIGFjb3VzdGljbmVzcywgc3BlZWNoaW5lc3MsIGluc3RydW1lbnRhbG5lc3MpICU+JQogIGFycmFuZ2UoZGVzYyhzY29yZSkpCgojIFZpZXcgdGhlIHJlc3VsdCB0YWJsZQpwcmludChyZXN1bHRfdGFibGUpCgpgYGAKV2l0aCB0aGlzIGRhdGEgZXhwbG9yYXRpb24sIHdlIGhhdmUgbm93IG1hZGUgYSBmb3JtdWxhIHRoYXQgd2lsbCBmaW5kIHVzIHRoZSBiZXN0IG92ZXJhbGwgc29uZyBpbiB0aGUgYmlsbGJvYXJkIHN1bW1lciBoaXRzIGRhdGFzZXQgdGhhdCBpcyB3aXRob3V0IGFueSBvcGluaW9uYXRlZCBpbnB1dC4gSXQgaXMgYWxsIHNvbGVseSBiYXNlZCBvbiBkYXRhIGdpdmVuIHRvIHVzZSBpbiBudW1lcmljYWwgb2JzZXJ2YXRpb25zIG9mIHNvbmdzIGRhbmNlYWJpbGl0eSwgdmFsZW5jZSwgYWNvdXN0aWNlbmVzcywgZW5lcmd5LCBhbmQgb3RoZXIgZmFjdG9ycy4gCgpHaXZlbiB0aGlzIG91dHB1dCwgdGhlIGJlc3Qgc29uZyBvbiB0aGlzIGxpc3QgaXM6CkVsZWN0cmljIEF2ZW5udWUgYnkgRWRkaWUgR3JhbnQgbWFkZSBpbiAxOTgzIHdpdGggYSBzY29yZSBvZiAuNzI4NzExNDQKCndoYXQgZWxzZSBjYW4gd2UgZmluZCBhYm91dCB0aGlzIHNvbmcgdGhhdCBtYWtlcyBpdCAidGhlIGJlc3QiPwoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMkZHVyYXRpb25fbWludXRlcyA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzJGR1cmF0aW9uX21zIC8gKDEwMDAgKiA2MCkKCmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgZmlsdGVyKHRyYWNrX25hbWUgPT0gIkVsZWN0cmljIEF2ZW5udWUiKSAlPiUKICBzZWxlY3QoZHVyYXRpb25fbWludXRlcywgdHJhY2tfbmFtZSwgZGFuY2VhYmlsaXR5LCB2YWxlbmNlLCBlbmVyZ3ksIGV2ZXJ5dGhpbmcoKSkKYGBgCndlIGNhbiBzZWUgdGhhdCB0aGlzIHNvbmcgaXMgMy4yIG1pbnV0ZXMgbG9uZywgYXMgd2VsbCBhcyBoYXZpbmcgYSB2ZXJ5IGhpZ2ggZGFuY2VhYmlsaXR5IHNjb3JlLiBIb3dldmVyLCB0aGUgZW5lcmd5IHNlZW1zIHRvIGJlIGEgYmUgbG93IHRoZSByZWFzb24gZm9yIGl0IGJlaW5nIHRoZSBiZXN0IG92ZXJhbGwgc29uZyBpcyB0aGUgZmFjdCB0aGF0IGl0cyB2YWxlbmNlIGlzIHJpZ2h0IHVwIHRoZXJlIHdpdGggZGFuY2VhYmlsaXR5IGluIGJlaW5nIHNvIGhpZ2guIEFuZCBhZnRlciBzZWVpbmcgdGhlIHNjb3JlcyBmb3IgaXRzIG90aGVyIHZhcmlhYmxlcywgaXQgY2FuIGJlIGNvbmZpcm1lZCBhcyB0byB3aHkgRWxlY3RyaWMgQXZlbm51ZSBpcyB0aGUgb3ZlcmFsbCBiZXN0IHNvbmcuICAKCgojIERhdGEgY29tcGFyaXNvbnMKCkluIHRoaXMgc2VjdGlvbiB3ZSB3YW50IHRvIGxvb2sgYXQgdGhlc2UgaGl0cyBhcyBhIHdob2xlLiBBcmUgdGhlcmUgYW55IHRyZW5kcyB3ZSBjYW4gc3BvdD8gCgojICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIE5vbWluYWwgRGF0YQoKVGhlIGZpcnN0IGRhdGEgdHlwZSB3ZSBsb29rZWQgYXQgd2FzIGlmIGEgc29uZyB3YXMgaW4gbWFqb3Igb3IgbWlub3IuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IG1vZGUsIGZpbGwgPSBtb2RlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC44KSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksIHZqdXN0ID0gLTAuNSkgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIE1vZGUiLAogICAgICAgeCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgIHkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNTZCNEU5IiwgIiNFNjlGMDAiKSkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCk5vdyB0aGF0IHdlIGNhbiBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgYXJlIGluIHRoZSBtYWpvciBtb2RlLiBXZSBkaWRuJ3QgZmVlbCBsaWtlIGl0IHdhcyBlbm91Z2ggYW5kIHdhbnRlZCB0byBrbm93IHRoZSBhbW91bnQgb2YgZWFjaCBkaWZmZXJlbnQga2V5IG1vZGVzIG9mIGFsbCB0aGUgc29uZ3Mgb3ZlciB0aGUgeWVhcnMuCgoKVGhlcmVmb3JlLCB3ZSB3aWxsIGZpbmQgdGhlIHNwZWNpZmljIGNvdW50cyBvZiBlYWNoIGtleSBtb2RlIGluIHRoaXMgZ3JhcGg6CgpgYGB7cn0KbGlicmFyeShkcGx5cikKCmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgY291bnQoa2V5X21vZGUsIG1vZGUpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoa2V5X21vZGUsIG4pLCB5ID0gbiwgZmlsbCA9IG1vZGUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBLZXkgTW9kZSIsCiAgICAgICB4ID0gIktleSBNb2RlIiwKICAgICAgIHkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNjZjMmE1IiwgIiNmYzhkNjIiKSwgbmFtZSA9ICJNb2RlIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKQW5kIGFmdGVyIGEgcXVpY2sgbG9vaywgd2UgY2FuIHNlZSB0aGF0IG1vc3Qgc29uZ3MgaGF2ZSB1c2VkIEMgbWFqb3IgaW4gdGhlIGJpbGxib2FyZCBzdW1tZXIgaGl0cy4gTWF5YmUgdGhpcyBtZWFucyBDIG1ham9yIGlzIHRoZSBiZXN0IGtleSBtb2RlIGZvciBtYWtpbmcgdGhlIHRvcCBiaWxsYm9hcmQgc3VtbWVyIGhpdHM/CgpUaGUgdGFibGUgYmVsb3cgaXMganVzdCB0byBzaG93IHNvbWUgc29uZ3MgdGhhdCBhcmUgaW4gdGhlIEMgbWFqb3Iga2V5IG1vZGU6CmBgYHtyfQphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcihrZXlfbW9kZSA9PSAiQyBtYWpvciIpICU+JQogIHNlbGVjdChrZXlfbW9kZSwgdHJhY2tfbmFtZSwgZXZlcnl0aGluZygpKQpgYGAKCgojIyBMb3VkbmVzcwoKKkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBMb3VkbmVzcyBzY2FsZToqIAoKYGBge3J9CmRpc19sb3VkIDwtIGdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSBsb3VkbmVzcykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC41LCBmaWxsID0gIiMzNDk4ZGIiLCBjb2xvciA9IiMyYzNlNTAiLCBhbHBoYSA9IC41KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTG91ZG5lc3MiLAogICAgIHggPSAiTG91ZG5lc3MiLAogICAgIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpnZ3Bsb3RseShkaXNfbG91ZCkKYGBgCgpIZXJlIHdlIGNhbiBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgbGF5IGJldHdlZW4gLTEwIERiIGFuZCAtNSBEYiwgYXMgd2VsbCBhcyB0aGUgZGF0YSBoYXZpbmcgYSBsZWZ0IHNrZXcuIFdlIHdhbnRlZCB0byBtYWtlIGEgdmVyeSBzaW1wbGUgYW5kIGVhc3kgZ3JhcGggdG8gbG9vayBhdCBmb3IgdGhlIGxvdWRuZXNzIHNjYWxlLCBtYWtpbmcgaXQgaW50ZXJhY3RpdmUgd2l0aCBwbG90bHkgYWxsb3dzIGZvciB1c2VycyB0byBob3ZlciBvdmVyIHRoZSBiYXJzIHRvIHNlZSB0aGUgaW5kaXZpZHVhbCBjb3VudHMgZm9yIGVhY2ggbG91ZG5lc3Mgc2NhbGUgaW50ZWdlci4gV2l0aCB0aGUgaGlnaGVzdCBiZWluZyA0MiBzb25ncyBhdCBhIGRlY2liZWwgbGV2ZWwgb2YgLTYuCgoKKk5vdyBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgbG91ZG5lc3MgY29tcGFyZWQgd2l0aCBvdGhlciB2YXJpYWJsZXM6KgoKRmlyc3QgdXAgaXMgbG91ZG5lc3MgY29tcGFyZWQgdG8gbGl2ZW5lc3MKCmBgYHtyfQpsb3VkX3ZfbGl2ZSA8LSBnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gbGl2ZW5lc3MsIHkgPSBsb3VkbmVzcykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBzaXplID0gMywgY29sb3IgPSAiIzM0OThkYiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjMmMzZTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiTG91ZG5lc3MgdnMgTGl2ZW5lc3MiLAogICAgICAgeCA9ICJMaXZlbmVzcyIsCiAgICAgICB5ID0gIkxvdWRuZXNzIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpnZ3Bsb3RseShsb3VkX3ZfbGl2ZSkKYGBgClRoaXMgZ3JhcGggc2hvd3MgdGhhdCB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiBsaXZlbGluZXNzIGFuZCBsb3VkbmVzcy4gVGhvdWdoLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IG1vc3Qgc29uZ3Mgb25seSBoYXZlIGEgc2xpZ2h0IGxpdmUgZWxlbWVudCB0byB0aGVtLiBUaGlzIGlzIHByb2JhYmx5IHRoZSBvdXRjb21lIG9mIHNvbmdzIGJlaW5nIHJlY29yZGVkIGluIHJlY29yZGluZyBzdHVkaW9zIGFzIG9wcG9zZWQgdG8gbGl2ZSBwZXJmb3JtYW5jZXMuCgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QobGl2ZW5lc3MsIGxvdWRuZXNzLCB0cmFja19uYW1lKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZW5lcmd5LCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIixjb2xvciA9ICIjMmMzZTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiTG91ZG5lc3MgdnMgRW5lcmd5IiwKICAgICAgIHggPSAiRW5lcmd5IiwKICAgICAgIHkgPSAiTG91ZG5lc3MiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCkVuZXJneSBhbmQgbG91ZG5lc3MgaGF2ZSBhIGZhdm9yYWJsZSBjb3JyZWxhdGlvbiB3aXRoIG9uZSBhbm90aGVyLiBUaGlzIGZpbmRpbmcgc3VwcG9ydHMgb3VyIGVhcmxpZXIgdGhlb3JpZXMgdGhhdCBzdWdnZXN0ZWQgdGhhdCBlbmVyZ3kgbGV2ZWxzIHdvdWxkIGluY3JlYXNlIHdpdGggbXVzaWMgdm9sdW1lLgoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgc2VsZWN0KGVuZXJneSwgbG91ZG5lc3MsICB0cmFja19uYW1lKQpgYGAKCiMjIERhbmNlYWJpbGl0eQoKKk5leHQgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGRhbmNlYWJpbGl0eSBzY2FsZToqIAoKYGBge3J9CmdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSBkYW5jZWFiaWxpdHkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMDUsIGZpbGwgPSAiIzhlNDRhZCIsIGNvbG9yID0gIiMwMDgwODAiLCBhbHBoYSA9IC41KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRGFuY2VhYmlsaXR5IiwKICAgICB4ID0gIkRhbmNlYWJpbGl0eSIsCiAgICAgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYApUaGUgc29uZyBkaXN0cmlidXRpb24gaXMgc2tld2VkIHNsaWdodGx5IHRvIHRoZSBsZWZ0IGFuZCBmb2xsb3dzIGEgc3RhbmRhcmQgYmVsbCBzaGFwZS4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhhdCBtb3N0IG9mIHRoZXNlIHNpbmdsZXMgYXJlIGF0IGxlYXN0IHNvbWV3aGF0IGRhbmNlYWJsZS4gCgoqTmV4dCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgZGFuY2VhYmlsaXR5IGNvbXBhcmVkIHdpdGggb3RoZXIgdmFyaWFibGVzOioKCkZpcnN0IHdlIHdpbGwgdGFrZSBhIGxvb2sgYXQgRW5lcmd5IGNvbXBhcmVkIHRvIERhbmNlYWJpbGl0eToKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gZW5lcmd5KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIHNpemUgPSAzLCBjb2xvciA9ICIjOGU0NGFkIikgKyAgIyBBZGp1c3RlZCBwb2ludCBhZXN0aGV0aWNzCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzAwODA4MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHRpdGxlID0gIkRhbmNlYWJpbGl0eSB2cyBFbmVyZ3kiLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKVGhlcmUgaXMgYSBzbWFsbCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVuZXJneSBhbmQgZGFuY2VhYmlsaXR5LiBUaG91Z2ggd2UgY2FuIHNlZSB0aGUgYmVzdCByYW5nZSBmb3IgYSBzb25nJ3MgZGFuY2VhYmlsaXR5IGlzIGZyb20gLjUgdG8gLjc1LgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QoZW5lcmd5LCBkYW5jZWFiaWxpdHksIHRyYWNrX25hbWUpCmBgYAoKCldpbGwgd2Ugc2VlIHRoZSBzYW1lIHRoaW5nIHdpdGggdGVtcG8/CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IGRhbmNlYWJpbGl0eSwgeSA9IHRlbXBvKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIHNpemUgPSAzLCBjb2xvciA9ICIjOGU0NGFkIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiMwMDgwODAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgdnMgVGVtcG8iLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJUZW1wbyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCkEgc29uZydzIGRhbmNlYWJpbGl0eSBjYW4gYmUgdmlld2VkIGFzIGEgZnVuY3Rpb24gb2YgaXRzIHRlbXBvOyB0aGlzIGdyYXBoIGluZGljYXRlcyB0aGF0IGEgdGVtcG8gb2YgYmV0d2VlbiAxNTAgYW5kIDEwMCBpcyBpZGVhbC4KCmBgYHtyfQphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIHNlbGVjdCh0ZW1wbywgZGFuY2VhYmlsaXR5LCB0cmFja19uYW1lKQpgYGAKCiMjIFZhbGVuY2UKClRvIHdoYXQgZXh0ZW50IGFyZSBzb25ncyBoYXBweT8gTGV0IHVzIGV4YW1pbmUgdGhlIGZvbGxvd2luZyBwYWlyIG9mIGdyYXBoczoKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9ICIiLCB5ID0gdmFsZW5jZSkpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjMmVjYzcxIiwgY29sb3IgPSAiI2U2N2UyMiIsIGFscGhhID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IG9mIFZhbGVuY2UiLAogICAgICAgeSA9ICJWYWxlbmNlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSB2YWxlbmNlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gLjA1LCBmaWxsID0gIiMyZWNjNzEiLCBjb2xvciA9ICIjZTY3ZTIyIiwgYWxwaGEgPSAuMikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIFZhbGVuY2UiLAogICAgIHggPSAiVmFsZW5jZSIsCiAgICAgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCkFjY29yZGluZyB0byB0aGVzZSBncmFwaHMsIGhhcHBpbmVzcyBoYXMgYSBzaWduaWZpY2FudCBsZWZ0d2FyZCBza2V3LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgdGhhdCBiZWNvbWUgaGl0cyB3aWxsIHNvdW5kIGhhcHB5Lgo8YnI+CkxldCdzIG5vdyBleGFtaW5lIGFuIGVuZXJneSBhbmQgdmFsZW5jZSBzY2F0dGVyIHBsb3Q6CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IHZhbGVuY2UsIHkgPSBlbmVyZ3kgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIHNpemUgPSAzLCBjb2xvciA9ICIjMmVjYzcxIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiNlNjdlMjIiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJWYWxlbmNlIHZzIEVuZXJneSIsCiAgICAgICB4ID0gIlZhbGVuY2UiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKSW4gYW55IGV2ZW50LCBJIGRvbid0IHRoaW5rIHRoaXMgaXMgYWxsIHRoYXQgc3VycHJpc2luZy4gSXQgYXBwZWFyZWQgZXZpZGVudCB0aGF0IGhhcHBpbmVzcyBhbmQgZW5lcmd5IHdlcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkLgoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgc2VsZWN0KGVuZXJneSwgdmFsZW5jZSwgdHJhY2tfbmFtZSkKYGBgCgojIEFydGlzdCBpbnNpZ2h0CldlIHdhbnQgdG8gZXhhbWluZSB0aGUgYXJ0aXN0IHdpdGggdGhlIGdyZWF0ZXN0IGhpdHMgaW4gdGhpcyBzZWN0aW9uIGFuZCBjb21wYXJlIHRoZW0gdG8gdGhlaXIgY29udGVtcG9yYXJpZXMuIERvZXMgc2FpZCBhcnRpc3QgYWRoZXJlIHRvIHRoZSBlc3RhYmxpc2hlZCB0cmVuZHM/IE9yIGFyZSB0aGV5IGdvaW5nIHRvIG92ZXJsb29rIHRoZW0/CgojICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIEV4cGxvcmF0aW9uCgpXaGF0IGFydGlzdCBoYXMgdGhlIG1vc3Qgc3VtbWVyIGhpdHM/CgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUgCiAgZ3JvdXBfYnkoYXJ0aXN0X25hbWUpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUgCiAgc2xpY2VfaGVhZChuID0gMSkKCmBgYApXaXRoIHNldmVuIGVudHJpZXMgb24gdGhlIGxpc3QsIFJpaGFubmEgZGVmZWF0ZWQgZXZlcnkgb3RoZXIgYXJ0aXN0IHRvIHRha2UgdGhlIHRvcCBzcG90LiBXaGljaCBzb25ncyB3ZXJlIHRoZXNlPwoKYGBge3J9CnJpaGFubmFfc29uZ3MgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUgCiAgZmlsdGVyKGFydGlzdF9uYW1lID09ICJSaWhhbm5hIikKCnJpaGFubmFfc29uZ3MgJT4lIApzZWxlY3QodHJhY2tfbmFtZSwgeWVhcikKYGBgCgoKVGhlIGxpc3Qgb2Ygc29uZ3MgaXMgdmlzaWJsZSBhYm92ZS4gV2UgaGF2ZSBsaXN0ZWQgdGhlIHNvbmdzIGJlbG93IGFsb25nIHdpdGggZXZlcnkgY2hhcmFjdGVyaXN0aWMgdGhhdCBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlbS4KCgpgYGB7cn0KcmloYW5uYV9zb25ncwpgYGAKCiMjIFJpaGFubmEgTm9taW5hbCBHcmFwaHMKCkFzIGluIHRoZSBwcmlvciBzZWN0aW9ucywgbGV0J3Mgc3RhcnQgYnkgZXhhbWluaW5nIFJpaGFubmEncyBub21pbmFsIHN0YXRpc3RpY3M6CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSByaWhhbm5hX3NvbmdzKSArCiAgZ2VvbV9iYXIoYWVzKHggPSBtb2RlLCBmaWxsID0gbW9kZSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjgsIHN0YXQgPSAiY291bnQiKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTW9kZXMgaW4gUmloYW5uYSdzIFNvbmdzIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMzNDk4ZGIiLCAiI2U3NGMzYyIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCldpdGggYSBoaWdoZXIgYXZlcmFnZSBvZiBzb25ncyBpbiBhIG1pbm9yIG1vZGUsIFJpaGFubmEgYmVhdHMgdGhlIG1lYW4gd2l0aCBhIHJhdGlvIG9mIDQ6My4KCgoKIyMgUmloYW5uYSBDb21wYXJpc29ucwpMZXQgdXMgdGFrZSBhIHF1aWNrIGxvb2sgYXQgUmloYW5uYSdzIHBsYWNlbWVudHMgaW4gc29tZSBvZiBvdXIgcHJldmlvdXMgZ3JhcGhzLiBIb3cgd2lsbCBzaGUgY29tcGFyZT8KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gdGVtcG8pKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICAjYWRkIHJpaGFubmFzIHNvbmdzCiAgZ2VvbV9wb2ludChkYXRhID0gcmloYW5uYV9zb25ncywgYWVzKHggPSBkYW5jZWFiaWxpdHksIHkgPSB0ZW1wbyksIGFscGhhID0gMSwgc2l6ZSA9IDMsIGNvbG9yID0gIiMyZWNjNzEiKSArCiAgCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgdnMgVGVtcG8iLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJUZW1wbyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICAjIEFkZCBSaWhhbm5hJ3Mgc29uZ3MKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpLCBhbHBoYSA9IDEsIHNpemUgPSAzLCBjb2xvciA9ICIjMmVjYzcxIikgKwogIAogIGxhYnModGl0bGUgPSAibG91ZG5lc3MgdnMgTGl2ZW5lc3MiLAogICAgICAgeCA9ICJMaXZlbmVzcyIsCiAgICAgICB5ID0gIkxvdWRuZXNzIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBzaXplID0gMywgY29sb3IgPSAiIzM0OThkYiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIAogICMgQWRkIFJpaGFubmEncyBzb25ncwogIGdlb21fcG9pbnQoZGF0YSA9IHJpaGFubmFfc29uZ3MsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSksIGFscGhhID0gMSwgc2l6ZSA9IDMsIGNvbG9yID0gIiMyZWNjNzEiKSArCiAgCiAgbGFicyh0aXRsZSA9ICJWYWxlbmNlIHZzIEVuZXJneSIsCiAgICAgICB4ID0gIlZhbGVuY2UiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgoKUmloYW5uYSdzIG11c2ljIGhhcyBhYm92ZS1hdmVyYWdlIGRhbmNlYWJpbGl0eSBhbmQgYSBkeW5hbWljIHRvdWNoIHRoYW5rcyB0byBpdHMgdmFyeWluZyB0ZW1wby4gSGVyIHN0dWRpby1jZW50cmljIHN0eWxlLCB3aGljaCBpcyBwb3NpdGlvbmVkIG9uIHRoZSBmYXIgbGVmdCBmb3IgbGl2ZWxpbmVzcywgaXMgaW4gbGluZSB3aXRoIHRoYXQgb2Ygb3RoZXIgYXJ0aXN0cy4gSGVyIHNvbmdzIGFyZSBub3RhYmxlIGZvciB0aGVpciBjb25zdGFudCBlbXBoYXNpcyBvbiB2b2x1bWUsIHdoaWNoIGhhcyBhIHN0cmlraW5nIGFuZCBjYXB0aXZhdGluZyBlZmZlY3QuIFJpaGFubmEncyBtdXNpYyBleHBsb3JlcyBhIHJhbmdlIG9mIGVuZXJneSBsZXZlbHMgd2hpbGUga2VlcGluZyBhIGNlbnRyYWwgdmFsZW5jZSwgbWFraW5nIGZvciBhIHZhcmllZCBhbmQgY2FwdGl2YXRpbmcgbGlzdGVuaW5nIGV4cGVyaWVuY2UuCgoKQXMgd2UgaGF2ZSBzaG93biBSaWhhbm5hIG1ha2VzIHVuaXF1ZSBtdXNpYyBjb21wYXJlZCB0byBtdXNpYyBhcyBhIHdob2xlLiBCdXQsIGxldHMgc2VlIGlmIHNoZSBnZXRzIGNsb3NlciB0byB0aGUgbWVhbiB3aGVuIHdlIGxvb2sgYXQgaGVyIHNvbmdzIHBlciB5ZWFyOgoKYGBge3J9CnNwZWNpZmljX3llYXJzIDwtIGMoMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMiwgMjAxNikgIyBZZWFycyB0aGF0IFJpaGFubmEgY2hhcnRlZAoKZmlsdGVyZWRfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcih5ZWFyICVpbiUgc3BlY2lmaWNfeWVhcnMpCgpnZ3Bsb3QoZGF0YSA9IGZpbHRlcmVkX2RhdGEsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gdGVtcG8pKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiT3RoZXIiKSwgYWxwaGEgPSAwLjcsIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoY29sb3IgPSAiUmloYW5uYSIpLCBhbHBoYSA9IDEsIHNpemUgPSAzKSArCiAgCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgYW5kIFRlbXBvIiwKICAgICAgIHggPSAiRGFuY2VhYmlsaXR5IiwKICAgICAgIHkgPSAiVGVtcG8iKSArCiAgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk90aGVyIiA9ICIjMzQ5OGRiIiwgIlJpaGFubmEiID0gIiMyZWNjNzEiKSwgbmFtZSA9ICJMZWdlbmQiKSArCiAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIAogICMgRmFjZXQgYnkgeWVhcgogIGZhY2V0X3dyYXAofiB5ZWFyLCBzY2FsZXMgPSAiZnJlZSIpCgpgYGAKCmBgYHtyfQpzcGVjaWZpY195ZWFycyA8LSBjKDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTIsIDIwMTYpICMgWWVhcnMgdGhhdCBSaWhhbm5hIGNoYXJ0ZWQKCmZpbHRlcmVkX2RhdGEgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBmaWx0ZXIoeWVhciAlaW4lIHNwZWNpZmljX3llYXJzKQoKZ2dwbG90KGRhdGEgPSBmaWx0ZXJlZF9kYXRhLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiT3RoZXIiKSwgYWxwaGEgPSAwLjcsIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoY29sb3IgPSAiUmloYW5uYSIpLCBhbHBoYSA9IDEsIHNpemUgPSAzKSArCiAgCiAgbGFicyh0aXRsZSA9ICJMb3VkbmVzcyB2cyBMaXZlbmVzcyIsCiAgICAgICB4ID0gIkxpdmVuZXNzIiwKICAgICAgIHkgPSAiTG91ZG5lc3MiKSArCiAgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk90aGVyIiA9ICIjMzQ5OGRiIiwgIlJpaGFubmEiID0gIiMyZWNjNzEiKSwgbmFtZSA9ICJMZWdlbmQiKSArCiAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIAogICMgRmFjZXQgYnkgeWVhcgogIGZhY2V0X3dyYXAofiB5ZWFyLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKCgoKYGBge3J9CnNwZWNpZmljX3llYXJzIDwtIGMoMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMiwgMjAxNikgIyBZZWFycyB0aGF0IFJpaGFubmEgY2hhcnRlZAoKZmlsdGVyZWRfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcih5ZWFyICVpbiUgc3BlY2lmaWNfeWVhcnMpCgpnZ3Bsb3QoZGF0YSA9IGZpbHRlcmVkX2RhdGEsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJPdGhlciIpLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIAogIGdlb21fcG9pbnQoZGF0YSA9IHJpaGFubmFfc29uZ3MsIGFlcyhjb2xvciA9ICJSaWhhbm5hIiksIGFscGhhID0gMSwgc2l6ZSA9IDMpICsKICAKICBsYWJzKHRpdGxlID0gIlZhbGVuY2UgdnMgRW5lcmd5IiwKICAgICAgIHggPSAiVmFsZW5jZSIsCiAgICAgICB5ID0gIkVuZXJneSIpICsKICAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiT3RoZXIiID0gIiMzNDk4ZGIiLCAiUmloYW5uYSIgPSAiIzJlY2M3MSIpLCBuYW1lID0gIkxlZ2VuZCIpICsKICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgCiAgIyBGYWNldCBieSB5ZWFyCiAgZmFjZXRfd3JhcCh+IHllYXIsIHNjYWxlcyA9ICJmcmVlIikKYGBgCgpUaGVzZSBncmFwaHMgZGVtb25zdHJhdGUgdGhhdCBSaWhhbm5hIGlzLCBpbiBmYWN0LCBleGNlcHRpb25hbC4gSGVyIHNvbmdzIGFyZSB0eXBpY2FsbHkgZm91bmQgb24gdGhlIGVkZ2Ugb2YgdGhlIHVuY2VydGFpbnR5IGNvbmUsIGJ1dCB0aGVyZSBpcyByb29tIGZvciB1bmNlcnRhaW50eSB3aXRoIG9ubHkgMTAgc2FtcGxlcy4gSGVyIG11c2ljIGRpZCBzZWVtIHRvIGRldmlhdGUgdGhlIG1vc3QgZnJvbSB0aGUgbWVhbiBpbiAyMDA3LCBhbmQgd2FzIHRoZSBjbG9zZXN0IGluIDIwMDggJiAyMDEyLgoKIyMgU3VtbWFyeQoKUmloYW5uYSdzIGluY3JlZGlibGUgbXVzaWNhbCBhYmlsaXR5LCB3aGljaCBjb21iaW5lcyBkeW5hbWljIHRlbXBvIGNoYW5nZXMgYW5kIGFib3ZlLWF2ZXJhZ2UgZGFuY2VhYmlsaXR5LCBmaXRzIGluIHdpdGggb3RoZXIgYXJ0aXN0cyBpbiBhIHN0dWRpby1jZW50cmljIGxpdmVsaW5lc3MuIEhlciBzb25ncyBzdGFuZCBvdXQgZm9yIGVtcGhhc2l6aW5nIGxvdWRuZXNzLCB3aGljaCBwcm9kdWNlcyBhbiBhcnJlc3RpbmcgYW5kIGFsbHVyaW5nIGVmZmVjdC4gQWx0aG91Z2ggdGhlcmUgaXMgc29tZSB1bmNlcnRhaW50eSBkdWUgdG8gdGhlIHNtYWxsIDEwLXNhbXBsZSBzaXplLCB0aGUgZ3JhcGhzIHNob3cgdGhhdCBoZXIgbXVzaWMgcmVndWxhcmx5IGZhbGxzIG9uIHRoZSBlZGdlIG9mIHRoZSB1bmNlcnRhaW50eSBjb25lLiBXaGlsZSBoZXIgbXVzaWMgY2FtZSB2ZXJ5IGNsb3NlIHRvIHRoZSBtZWFuIGluIDIwMDggYW5kIDIwMTIsIHRoZXJlIHdlcmUgc29tZSBub3RhYmxlIGRlcGFydHVyZXMgZnJvbSB0aGUgbWVhbiBpbiAyMDA3LiBUaGlzIGNvbWJpbmF0aW9uIGhpZ2hsaWdodHMgUmloYW5uYSdzIGludGVyZXN0aW5nIGFuZCB2YXJpZWQgY2FyZWVyIGluIG11c2ljLCBib3RoIHN0eWxpc3RpY2FsbHkgYW5kIG51bWVyaWNhbGx5LgoKIyBGb3IgRnV0dXJlIENvbnNpZGVyYXRpb24KCkRvZXMgbGVuZ3RoIG9mIHNvbmcgY29ycmVsYXRlIHRvIGRhbmNlYWJpbGl0eSBzY29yZXM/IApgYGB7cn0KZGYgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QoZGFuY2VhYmlsaXR5LCBkdXJhdGlvbl9tcywgdHJhY2tfbmFtZSwgYXJ0aXN0X25hbWUpICU+JQogIGFycmFuZ2UoZGVzYyhkdXJhdGlvbl9tcykpCgpkZiRkdXJhdGlvbl9taW51dGVzIDwtIGRmJGR1cmF0aW9uX21zIC8gKDEwMDAgKiA2MCkKCmRmICU+JQogIHNlbGVjdChkYW5jZWFiaWxpdHksIGR1cmF0aW9uX21pbnV0ZXMsIHRyYWNrX25hbWUsIGFydGlzdF9uYW1lKQoKCgpgYGAKCkluIHRoZSBlbmQsIHdlIHZlcnkgYnJpZWZseSBsb29rZWQgaW50byB3aGF0IHNvbWUgY29ycmVsYXRpb25zIGNvdWxkIGJlIGJldHdlZW4gdGhlIGxlbmd0aCBvZiBzb25ncyBhbmQgdGhlaXIgZGFuY2VhYmlsaXR5IHNjb3JlLiBBcyB3ZSBjYW4gc2VlIGFib3ZlIGluIHRoZSB0YWJsZSwgdGhlIGxvbmdlc3Qgc29uZyAoaW4gbWludXRlcykgaXMgIkkgd2FudCB5b3VyIHNleCBQdHMgMSBhbmQgMiByZW1hc3RlcmVkIiBieSBHZW9yZ2UgTWljaGFlbHMgd2l0aCBhIGRhbmNlYWJpbGl0eSBzY29yZSBvZiAuODEyLiBCdXQgcmlnaHQgYmVsb3cgaXQgaXMgYW4gOC45NSBtaW51dGUgbG9uZyBzb25nIHdpdGggYSBzY29yZSBvZiAuMjE3LiBXaGljaCB0byB1cywgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UsIGlmIGEgc29uZyBpcyB2ZXJ5IGxvbmcgdGhlbiB5b3Ugd291bGRuJ3Qgd2FudCB0byBkYW5jZSBmb3IgdG9vIGxvbmcgYnV0IHRoZW4gaXQgc2VlbXMgbGlrZSB0aGVyZSBjb3VsZCBiZSBvdXRsaWVycyB0byB0aGlzLiBXZSB3YW50ZWQgdG8gbGVhdmUgdGhpcyBmb3IgdGhlIGVuZCBmb3IgZnV0dXJlIGNvbnNpZGVyYXRpb24gdG8gdGFrZSBpdCBmdXJ0aGVyIHdoZW4gd2UgYXJlIG1vcmUgcHJvZmljaWVudCB0aGFuIHdlIGFyZSB3aXRoIFIgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGlzIGRldGFpbC4gCgojIENvbmNsdXNpb24KCkluIGNvbmNsdXNpb24sIG91ciBpbnZlc3RpZ2F0aW9uIGhhcyBleHBsb3JlZCB0aGUgZHluYW1pYyBlbnZpcm9ubWVudCBvZiBCaWxsYm9hcmQgc3VjY2Vzc2VzIGJldHdlZW4gMTk1OSBhbmQgMjAxNywgcmV2ZWFsaW5nIG5vdGFibGUgY2hhbmdlcyBpbiBtdXNpY2FsIHN0eWxlcyBhbmQgdHJhaXRzLiBXZSBjcmVhdGVkIGEgZm9ybXVsYSB0byBvYmplY3RpdmVseSBpZGVudGlmeSB0aGUgZ3JlYXRlc3Qgc29uZyBvdmVyYWxsIGluIHRoZSBCaWxsYm9hcmQgc3VtbWVyIGhpdHMgZGF0YXNldCBieSB1c2luZyBhIHRob3JvdWdoIGFuYWx5c2lzLiBUaGlzIGZvcm11bGEgdG9vayBpbnRvIGFjY291bnQgaW1wb3J0YW50IHBhcmFtZXRlcnMgbGlrZSBkYW5jZWFiaWxpdHksIGxpdmVuZXNzLCBlbmVyZ3ksIGFuZCBtb3JlLiBXZSBkZXZlbG9wZWQgYSBncmFkaW5nIHN5c3RlbSB0aGF0IGFzc2lnbnMgc29uZ3MgdG8gdGllcnMgYmFzZWQgb24gb3VyIG1ldGljdWxvdXMgc3R1ZHkgYW5kIGJhbGFuY2luZyBvZiB0aGVzZSBlbGVtZW50cywgb2ZmZXJpbmcgYW4gb2JqZWN0aXZlIGV2YWx1YXRpb24gb2YgdGhlaXIgZ2VuZXJhbCBxdWFsaXR5LiBBbmFseXppbmcgbm9taW5hbCBkYXRhIGV4cG9zZWQgaW50ZXJlc3RpbmcgdHJlbmRzLCBsaWtlIHRoZSBkb21pbmFuY2Ugb2YgQyBtYWpvciBrZXkgbW9kZSBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBzb25ncyBpbiB0aGUgbWFqb3IgbW9kZS4gV2UgYWxzbyBsb29rZWQgaW50byB2YWxlbmNlLCBsb3VkbmVzcywgYW5kIGRhbmNlYWJpbGl0eSwgZmluZGluZyBwYXR0ZXJucyBhbmQgaW5zaWdodHMgaW50byB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGVzZSBtdXNpY2FsIGNvbXBvbmVudHMuIEFkZGl0aW9uYWwgYXJ0aXN0LXNwZWNpZmljIHJlc2VhcmNoLCB3aXRoIGEgc3BlY2lhbCBmb2N1cyBvbiBSaWhhbm5hLCBoaWdobGlnaHRlZCBoZXIgdW5pcXVlIG11c2ljYWwgcXVhbGl0aWVzIGFuZCB0aGUgZGl2ZXJzaXR5IGFuZCBvcmlnaW5hbGl0eSBzZWVuIGluIHRoZSBsYXJnZXIgZGF0YXNldC4gQWxsIHRoaW5ncyBjb25zaWRlcmVkLCBvdXIgc3R1ZHkgcHJvdmlkZXMgYSB0aG9yb3VnaCBleGFtaW5hdGlvbiBvZiB0aGUgbXVzaWNhbCBsYW5kc2NhcGUgb3ZlciB0aGUgY291cnNlIG9mIHNpeCBkZWNhZGVzLCBwcm92aWRpbmcgaW5zaWdodGZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudHMgdGhhdCBsZWFkIHRvIHRoZSBwb3B1bGFyaXR5IG9mIEJpbGxib2FyZCBzdW1tZXIgc3VjY2Vzc2VzLgoKIyBHbG9zc2FyeQoKRGFuY2VhYmlsaXR5OiBBIG1lYXN1cmUgb2YgaG93IHN1aXRhYmxlIGEgdHJhY2sgaXMgZm9yIGRhbmNpbmcgYmFzZWQgb24gZmFjdG9ycyBsaWtlIHRlbXBvLCByaHl0aG0gc3RhYmlsaXR5LCBiZWF0IHN0cmVuZ3RoLCBhbmQgb3ZlcmFsbCByZWd1bGFyaXR5LgoKRW5lcmd5OiBSZXByZXNlbnRzIHRoZSBpbnRlbnNpdHkgYW5kIGFjdGl2aXR5IGxldmVsIG9mIGEgc29uZy4gSGlnaCBlbmVyZ3kgc29uZ3MgbWlnaHQgYmUgbW9yZSBsaXZlbHkgYW5kIGR5bmFtaWMsIHdoaWxlIGxvdyBlbmVyZ3kgc29uZ3MgbWF5IGJlIG1vcmUgY2FsbSBhbmQgc3ViZHVlZC4KCktleTogSW5kaWNhdGVzIHRoZSBrZXkgc2lnbmF0dXJlIG9mIHRoZSBzb25nLCByZXByZXNlbnRpbmcgdGhlIHRvbmFsIGNlbnRlciBvciBob21lIGJhc2Ugb2YgdGhlIG11c2ljLgoKTG91ZG5lc3M6IFJlZmVycyB0byB0aGUgdm9sdW1lIG9mIHRoZSBzb25nLiBJdCdzIHVzdWFsbHkgbWVhc3VyZWQgaW4gZGVjaWJlbHMgKGRCKS4gSGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsb3VkZXIgc29uZ3MuCgpNb2RlOiBEZXNjcmliZXMgdGhlIG1vZGFsaXR5IG9mIHRoZSBtdXNpYywgaS5lLiwgd2hldGhlciBpdCdzIGluIGEgbWFqb3Igb3IgbWlub3Iga2V5LiBNYWpvciBrZXlzIG9mdGVuIHNvdW5kIG1vcmUgdXBsaWZ0aW5nLCB3aGlsZSBtaW5vciBrZXlzIGNhbiBnaXZlIGEgbW9yZSBtZWxhbmNob2xpYyBmZWVsLgoKU3BlZWNoaW5lc3M6IE1lYXN1cmVzIHRoZSBwcmVzZW5jZSBvZiBzcG9rZW4gd29yZHMgaW4gYSB0cmFjay4gU29uZ3Mgd2l0aCBoaWdoZXIgc3BlZWNoaW5lc3MgdmFsdWVzIG1heSBjb250YWluIG1vcmUgc3Bva2VuIHdvcmRzIHRoYW4gc2luZ2luZy4KCkFjb3VzdGljbmVzczogSW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0cmFjayBpcyBhY291c3RpYywgbWVhbmluZyBpdCBkb2Vzbid0IGhlYXZpbHkgcmVseSBvbiBlbGVjdHJvbmljIG9yIHN5bnRoZXNpemVkIGVsZW1lbnRzLgoKSW5zdHJ1bWVudGFsbmVzczogTWVhc3VyZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRyYWNrIGlzIGluc3RydW1lbnRhbCwgd2l0aG91dCB2b2NhbCBjb250ZW50LgoKTGl2ZW5lc3M6IEluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgYW4gYXVkaWVuY2UgaW4gdGhlIHJlY29yZGluZy4gQSBoaWdoZXIgdmFsdWUgc3VnZ2VzdHMgdGhlIHRyYWNrIHdhcyBsaWtlbHkgcmVjb3JkZWQgbGl2ZS4KClZhbGVuY2U6IERlc2NyaWJlcyB0aGUgbXVzaWNhbCBwb3NpdGl2ZW5lc3Mgb2YgYSB0cmFjay4gSGlnaGVyIHZhbGVuY2UgdmFsdWVzIHN1Z2dlc3QgYSBtb3JlIHBvc2l0aXZlLCBoYXBweSwgb3IgY2hlZXJmdWwgbW9vZC4KClRlbXBvOiBSZXByZXNlbnRzIHRoZSBzcGVlZCBvciBwYWNlIG9mIGEgc29uZywgdHlwaWNhbGx5IG1lYXN1cmVkIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSkuCgpEdXJhdGlvbl9tczogVGhlIGR1cmF0aW9uIG9mIHRoZSBzb25nIGluIG1pbGxpc2Vjb25kcy4KClRpbWUgU2lnbmF0dXJlOiBEZXNjcmliZXMgdGhlIG51bWJlciBvZiBiZWF0cyBpbiBhIGJhciBhbmQgd2hpY2ggbm90ZSB2YWx1ZSBnZXRzIHRoZSBiZWF0LgoKS2V5IE1vZGU6IEEgY29tYmluYXRpb24gb2Yga2V5IGFuZCBtb2RlLCBpbmRpY2F0aW5nIGJvdGggdGhlIHRvbmFsIGNlbnRlciBhbmQgdGhlIG1vZGFsaXR5IG9mIHRoZSBtdXNpYy4=